package com.f21.f21assessoria.model.ergonometria;

import java.beans.Transient;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

import com.f21.f21assessoria.model.cadastro.Usuario;

@Entity
public class Treinamento implements Operavel, Serializable {
	
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private long id;
	
	private Usuario aluno;
	
	private String nome;

	private Integer idade = 0;

	private String objetivo;

	private String observacao;
	
	@Temporal(TemporalType.DATE)
	private Calendar dtAvaliacao;
	@Temporal(TemporalType.DATE)
	private Calendar dtInicio;
	@Temporal(TemporalType.DATE)
	private Calendar dtReavaliacao;
	@Temporal(TemporalType.DATE)
	private Calendar dtMudancaTreinamento;

	private int frequenciaCardiacaRep;

	private int vo2;

	private int gordura;

	@OneToMany(fetch = FetchType.EAGER, mappedBy = "treinamento", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE) 
	private Set<FrequenciaCardiacaTreino> listFreq;
	
	@OneToMany(fetch = FetchType.EAGER, mappedBy = "treinamento", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE) 
	private Set<VelocidadeTreino> listVelocTreino;

	@OneToMany(fetch = FetchType.EAGER, mappedBy = "treinamento", cascade = CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE) 
	private Set<Treino> listTreino;
	
	public Treinamento() {

		this.listFreq = new HashSet<>();
		this.listTreino = new HashSet<>();
		this.listVelocTreino = new HashSet<>();
	}
	
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
	
	public Usuario getAluno() {
		return aluno;
	}

	public void setAluno(Usuario aluno) {
		this.aluno = aluno;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getFrequenciaCardMax() {
		return 220-idade;
	}

	/**
	 * @see com.f21.f21assessoria.model.ergonometria.Operavel#AtribuiOperacao(com.f21.f21assessoria.model.ergonometria.Operador)
	 */
	public void AtribuiOperacao(Operador operador) {
		operador.opera(this);
	}

	public Integer getIdade() {
		return idade;
	}

	public String getObjetivo() {
		return objetivo;
	}

	public String getObservacao() {
		return observacao;
	}

	public Calendar getDtAvaliacao() {
		return dtAvaliacao;
	}

	public Calendar getDtInicio() {
		return dtInicio;
	}

	public Calendar getDtReavaliacao() {
		return dtReavaliacao;
	}

	public Calendar getDtMudancaTreinamento() {
		return dtMudancaTreinamento;
	}

	public int getFrequenciaCardiacaRep() {
		return frequenciaCardiacaRep;
	}

	public int getVo2() {
		return vo2;
	}

	public int getGordura() {
		return gordura;
	}

	public Set<FrequenciaCardiacaTreino> getListFreq() {
		return listFreq;
	}

	public void setIdade(Integer idade) {
		this.idade = idade;
	}

	public void setObjetivo(String objetivo) {
		this.objetivo = objetivo;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public void setDtAvaliacao(Calendar dtAvaliacao) {
		this.dtAvaliacao = dtAvaliacao;
	}

	public void setDtInicio(Calendar dtInicio) {
		this.dtInicio = dtInicio;
	}

	public void setDtReavaliacao(Calendar dtReavaliacao) {
		this.dtReavaliacao = dtReavaliacao;
	}

	public void setDtMudancaTreinamento(Calendar dtMudancaTreinamento) {
		this.dtMudancaTreinamento = dtMudancaTreinamento;
	}
	

	public void setFrequenciaCardiacaRep(int frequenciaCardiacaRep) {
		this.frequenciaCardiacaRep = frequenciaCardiacaRep;
	}

	public void setVo2(int vo2) {
		this.vo2 = vo2;
	}

	public void setGordura(int gordura) {
		this.gordura = gordura;
	}

	public void setListFreq(Set<FrequenciaCardiacaTreino> listFreq) {
		this.listFreq = listFreq;
	}

	public void addFrequenciaCardiacaTreino(FrequenciaCardiacaTreino frequenciaCardiacaTreino){
		frequenciaCardiacaTreino.setTreinamento(this);
		this.listFreq.add(frequenciaCardiacaTreino);
	}

	public Set<VelocidadeTreino> getListVelocTreino() {
		return listVelocTreino;
	}

	

	public void setListVelocTreino(Set<VelocidadeTreino> listVelocTreino) {
		this.listVelocTreino = listVelocTreino;
	}
	
	public void addVelocidadeTreino(VelocidadeTreino velocidadeTreino){
		velocidadeTreino.setTreinamento(this);
		this.listVelocTreino.add(velocidadeTreino);
	}

	public Set<Treino> getListTreino() {
		return listTreino;
	}

	public void setListTreino(Set<Treino> listTreino) {
		this.listTreino = listTreino;
	}

	public void addTreino(Treino treino){
		treino.setTreinamento(this);
		this.listTreino.add(treino);
	}
	
}
